using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectPooler : MonoBehaviour // 对象池类
{
    [SerializeField] private GameObject prefab; // 预制体
    [SerializeField] private int poolSize = 10; // 对象池大小

    private List<GameObject> _pool; // 对象池列表
    private GameObject _poolContainer;//对象池父级

    private void Awake() // 在对象被唤醒时调用
    {
        _pool = new List<GameObject>(); // 初始化对象池列表
        _poolContainer = new GameObject($"Pool - {prefab.name}");
        CreatePooler(); // 创建对象池
    }

    private void CreatePooler() // 创建对象池方法
    {
        for (int i = 0; i < poolSize; i++) // 循环生成指定数量的对象
        {
            _pool.Add(CreateInstance()); // 往对象池中添加新实例
        }
    }

    private GameObject CreateInstance() // 创建单个实例方法
    {
        GameObject newInstance = Instantiate(prefab); // 实例化预制体
        newInstance.transform.SetParent(_poolContainer.transform);//设置父级
        newInstance.SetActive(false); // 设置实例为非激活状态
        return newInstance; // 返回新实例
    }

    public GameObject GetInstanceFromPool() // 从对象池获取实例的方法
    {
        for (int i = 0; i < _pool.Count; i++) // 遍历对象池
        {
            if (!_pool[i].activeInHierarchy) // 如果对象未激活
            {
                return _pool[i]; // 返回未激活的对象
            }
        }
        return CreateInstance(); // 如果对象池中没有未激活的对象，则创建一个新实例并返回
    }

    public static void ReturnToPool(GameObject instance)
    {
        instance.SetActive(false);
    }

    public static IEnumerator ReturnToPoolWithDelay(GameObject instance, float delay)
    {
        yield return new WaitForSeconds(delay);
        instance.SetActive(false);
    }
}
